home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 1
/
Cream of the Crop 1.iso
/
PROGRAM
/
TPLY30.ARJ
/
EXPR.Y
< prev
next >
Wrap
Text File
|
1991-05-01
|
2KB
|
71 lines
/* Sample Yacc grammar for a simple desktop calculator; derived from a
grammar in Aho et al: Compilers. Principles, Techniques and Tools (sect.
4.9).
Lexical analyzer is in Lex program ExprLex.l.
To compile parser and lexical analyzer, issue the following commands:
yacc expr
lex exprlex
tpc expr
Description: This program reads simple arithmetic expressions, constructed
with real constants, operators +, -, *, /, unary - and parentheses
(operators have their usual precedence, unary minus is highest), from
standard input (one per line) and prints the result on standard output.
Variables are denoted by a single letter (no distinction between upper and
lowercase letters); they are assigned values through an assignment of the
form <var>=<expr>.
The program is terminated by entering an empty line. */
%{
uses YaccLib, LexLib;
var x : array [1..26] of Real;
%}
%token <Real> NUM /* constants */
%token <Integer> ID /* variables */
%type <Real> expr /* expressions */
%left '+' '-' /* operators */
%left '*' '/'
%right UMINUS
%token ILLEGAL /* illegal token */
%%
input : /* empty */
| input '\n' { yyaccept; }
| input expr '\n' { writeln($2:10:2); }
| input ID '=' expr '\n' { x[$2] := $4; writeln($4:10:2); }
| error '\n' { yyerrok; }
;
expr : expr '+' expr { $$ := $1 + $3; }
| expr '-' expr { $$ := $1 - $3; }
| expr '*' expr { $$ := $1 * $3; }
| expr '/' expr { $$ := $1 / $3; }
| '(' expr ')' { $$ := $2; }
| '-' expr { $$ := -$2; }
%prec UMINUS
| NUM { $$ := $1; }
| ID { $$ := x[$1]; }
;
%%
{$I ExprLex}
var i : Integer;
begin
for i := 1 to 26 do x[i] := 0.0;
if yyparse=0 then { done };
end.